#ifndef __COMMON_TYPES_H__
#define __COMMON_TYPES_H__

// ==============================================================================
// 1. 编译器/平台兼容性判断
// ==============================================================================
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
// C99 及以上标准：直接使用 stdint.h 标准类型（推荐）
#include <stdint.h>
#include <stdbool.h>  // 同时封装 bool 类型
#elif defined(_MSC_VER)
// Microsoft Visual C++（MSVC）：使用微软专用头文件
#include <stdint.h>
#include <stdbool.h>
#elif defined(__ARMCC_VERSION__) || defined(__GNUC__)
// ARMCC/GCC（嵌入式常用编译器）：兼容 stdint.h 或手动定义
#if __has_include(<stdint.h>)
#include <stdint.h>
#include <stdbool.h>
#else
// 无 stdint.h 时，手动定义（确保类型宽度正确）
typedef unsigned char       uint8_t;
typedef signed char         int8_t;
typedef unsigned short      uint16_t;
typedef signed short        int16_t;
typedef unsigned int        uint32_t;
typedef signed int          int32_t;
typedef unsigned long long  uint64_t;
typedef signed long long    int64_t;

// 手动定义 bool 类型（C99 之前无 bool）
typedef unsigned char       bool;
#define true                1
#define false               0
#endif
#else
// 其他编译器：保底手动定义（适配老旧环境）
typedef unsigned char       uint8_t;
typedef signed char         int8_t;
typedef unsigned short      uint16_t;
typedef signed short        int16_t;
typedef unsigned int        uint32_t;
typedef signed int          int32_t;
typedef unsigned long long  uint64_t;
typedef signed long long    int64_t;

typedef unsigned char       bool;
#define true                1
#define false               0
#endif

// ==============================================================================
// 2. 常用类型别名（简化代码，提升可读性）
// ==============================================================================
typedef uint8_t             u8;    // 8位无符号整数（简化别名）
typedef int8_t              s8;    // 8位有符号整数
typedef uint16_t            u16;   // 16位无符号整数（重点需求）
typedef int16_t             s16;   // 16位有符号整数
typedef uint32_t            u32;   // 32位无符号整数
typedef int32_t             s32;   // 32位有符号整数
typedef uint64_t            u64;   // 64位无符号整数
typedef int64_t             s64;   // 64位有符号整数

// 指针类型（统一宽度，跨平台兼容）
typedef uintptr_t           uintptr_t;  // 无符号指针类型（C99 标准）
typedef intptr_t            intptr_t;   // 有符号指针类型

// ==============================================================================
// 3. 类型宽度静态断言（强制校验，避免平台差异）
// ==============================================================================
// C11 及以上支持 _Static_assert，确保类型宽度符合预期
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
_Static_assert(sizeof(uint8_t) == 1, "uint8_t must be 1 byte");
_Static_assert(sizeof(uint16_t) == 2, "uint16_t must be 2 bytes");
_Static_assert(sizeof(uint32_t) == 4, "uint32_t must be 4 bytes");
_Static_assert(sizeof(uint64_t) == 8, "uint64_t must be 8 bytes");
_Static_assert(sizeof(bool) == 1, "bool must be 1 byte");
#elif defined(_MSC_VER)
// MSVC 支持 __static_assert（C11 之前）
__static_assert(sizeof(uint8_t) == 1, "uint8_t must be 1 byte");
__static_assert(sizeof(uint16_t) == 2, "uint16_t must be 2 bytes");
__static_assert(sizeof(uint32_t) == 4, "uint32_t must be 4 bytes");
__static_assert(sizeof(uint64_t) == 8, "uint64_t must be 8 bytes");
__static_assert(sizeof(bool) == 1, "bool must be 1 byte");
#endif

// ==============================================================================
// 4. 常用宏定义（补充类型相关常量）
// ==============================================================================
// 无符号类型最大值（避免依赖 <limits.h>）
#define UINT8_MAX           ((uint8_t)0xFF)
#define UINT16_MAX          ((uint16_t)0xFFFF)
#define UINT32_MAX          ((uint32_t)0xFFFFFFFF)
#define UINT64_MAX          ((uint64_t)0xFFFFFFFFFFFFFFFF)

// 有符号类型最大值/最小值
#define INT8_MAX            ((int8_t)0x7F)
#define INT8_MIN            ((int8_t)0x80)
#define INT16_MAX           ((int16_t)0x7FFF)
#define INT16_MIN           ((int16_t)0x8000)
#define INT32_MAX           ((int32_t)0x7FFFFFFF)
#define INT32_MIN           ((int32_t)0x80000000)
#define INT64_MAX           ((int64_t)0x7FFFFFFFFFFFFFFF)
#define INT64_MIN           ((int64_t)0x8000000000000000)

// 空指针定义（兼容 NULL 和 nullptr）
#ifndef NULL
#ifdef __cplusplus
#define NULL                nullptr
#else
#define NULL                ((void *)0)
#endif
#endif

// ==============================================================================
// 5. 可选：嵌入式平台专用类型（按需启用）
// ==============================================================================
#ifdef EMBEDDED_PLATFORM  // 编译时定义 -DEMBEDDED_PLATFORM 启用
// 位类型（适配MCU寄存器操作）
typedef uint8_t             bit8_t;    // 8位位域类型
typedef uint16_t            bit16_t;   // 16位位域类型
typedef uint32_t            bit32_t;   // 32位位域类型

// 寄存器类型（volatile 修饰，避免编译器优化）
typedef volatile uint8_t    reg8_t;    // 8位寄存器
typedef volatile uint16_t   reg16_t;   // 16位寄存器
typedef volatile uint32_t   reg32_t;   // 32位寄存器
#endif

#endif  // __COMMON_TYPES_H__